import {getUserTempId,setUserToken,getUserToken,deleteUserToken} from '@/utils/userAuth'
import {Message} from 'element-ui'
import {reqLogin,reqUserInfo,reqLogout} from '@/api'

const actions = {
	//用户登录的action
	/* 
		1.vuex中action是有返回值的
		2.返回值的规则同then方法
		3.我们会根据业务逻辑的成功与失败，去动态决定action返回的那个Promise实例的成功与失败
	*/
	async userLogin({commit},loginParams){
		//发请求去登录
		const result = await reqLogin(loginParams)
		//判断登录这个业务逻辑是否成功
		if(result.code === 200){
			//若登录成功，提示一下
			Message({message: '登录成功！',type: 'success'})
			//触发mutations去存储token（存入vuex）
			commit('SAVE_USER_TOKEN',result.data.token)
			//再将token存入local中（目的是：刷新也不丢）
			setUserToken(result.data.token)
			// return undefined //该行要返回一个非Promise值，userLogin返回的Promise实例就是成功的。
		}else{
			//若登录失败，提示一下
			Message.error(result.message)
			return new Promise(()=>{}) //该行要返回一个pending的Promise值，让链中断。
		}
	},
	//根据token请求用户信息的信息
	async getUserInfo({commit}){
		//发请求获取用户信息
		const result = await reqUserInfo()
		//判断
		if(result.code === 200){
			//获取用户信息传给，随后存储到vuex中就可以了
			commit('SAVE_USER_INFO',result.data)
		}else{
			//获取用户信息失败，提示为什么失败
			Message.error(result.message)
			return Promise.reject('fail')
		}
	},
	async userLogout({commit}){
		//请求服务器去退出登录
		const result = await reqLogout()
		//判断
		if(result.code === 200){
			//服务器那边退出成功了，本地的这点事也得做好
			commit('LOG_OUT') //清空vuex中数据
			deleteUserToken() //清空local中的token
		}else{
			Message.error(result.message)
			return new Promise(()=>{})
		}
	}
}

const mutations = {
	SAVE_USER_TOKEN(state,token){
		state.userToken = token
	},
	SAVE_USER_INFO(state,info){
		state.userInfo = info
	},
	LOG_OUT(state){
		state.userInfo = {}
		state.userToken = ''
	}
}

const state = {
	userTempId:getUserTempId(),
	userToken:getUserToken(),
	userInfo:{}
}

const getters = {}

export default {
	namespaced:true,
	actions,
	mutations,
	state,
	getters
}